From 727c37ef78f2229998ac51942f5d11c754d0c6b9 Mon Sep 17 00:00:00 2001
From: Robert Hancock <hancock@sedsystems.ca>
Date: Mon, 13 Jul 2020 17:33:48 -0600
Subject: [PATCH] Fix errors during gpsd 3.20 cross-compilation

Adapt some post-3.20 changes to the gpsd SConstruct file from the
gpsd master branch to fix issues when cross-compiling. Original
commits did not cherry-pick cleanly onto 3.20 due to other
upstream changes.

Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
---
 SConstruct | 81 ++++++++++++++++++++++--------------------------------
 1 file changed, 33 insertions(+), 48 deletions(-)

diff --git a/SConstruct b/SConstruct
index 33e0ff326..93e8fcfea 100644
--- a/SConstruct
+++ b/SConstruct
@@ -386,13 +386,16 @@ env['SC_PYTHON'] = sys.executable  # Path to SCons Python
 # So we rely on MergeFlags/ParseFlags to do the right thing for us.
 env['STRIP'] = "strip"
 env['PKG_CONFIG'] = "pkg-config"
-for i in ["AR", "CC", "CXX", "LD",
-          "PKG_CONFIG", "STRIP", "TAR"]:
+for i in ["AR",      # linker for static libs, usually "ar"
+          "CC",
+          "CXX",
+          # "LD",    # scons does not use LD, usually "ld"
+          "PKG_CONFIG",
+          "SHLINK",  # linker for shared libs, usually "gcc" or "g++", NOT "ld"
+          "STRIP",
+          "TAR"]:
     if i in os.environ:
-        j = i
-        if i == "LD":
-            i = "SHLINK"
-        env[i] = os.getenv(j)
+        env[i] = os.getenv(i)
 for i in ["ARFLAGS", "CFLAGS", "CXXFLAGS", "LDFLAGS", "SHLINKFLAGS",
           "CPPFLAGS", "CCFLAGS", "LINKFLAGS"]:
     if i in os.environ:
@@ -483,7 +486,7 @@ devenv = (("ADDR2LINE", "addr2line"),
           ("GCCBUG", "gccbug"),
           ("GCOV", "gcov"),
           ("GPROF", "gprof"),
-          ("LD", "ld"),
+          # ("LD", "ld"),     # scons does not use LD
           ("NM", "nm"),
           ("OBJCOPY", "objcopy"),
           ("OBJDUMP", "objdump"),
@@ -565,6 +568,22 @@ def CheckXsltproc(context):
     return ret
 
 
+def CheckTime_t(context):
+    context.Message('Checking if sizeof(time_t) is 64 bits... ')
+    ret = context.TryLink("""
+        #include <time.h>
+
+        int main(int argc, char **argv) {
+            static int test_array[1 - 2 * ((long int) sizeof(time_t) < 8 )];
+            test_array[0] = 0;
+            (void) argc; (void) argv;
+            return 0;
+        }
+    """, '.c')
+    context.Result(ret)
+    return ret
+
+
 def CheckCompilerOption(context, option):
     context.Message('Checking if compiler accepts %s... ' % (option,))
     old_CFLAGS = context.env['CFLAGS'][:]  # Get a *copy* of the old list
@@ -597,42 +616,6 @@ def CheckHeaderDefines(context, file, define):
     return ret
 
 
-def CheckSizeOf(context, type):
-    """Check sizeof 'type'"""
-    context.Message('Checking size of ' + type + '... ')
-
-    program = """
-#include <stdlib.h>
-#include <stdio.h>
-
-/*
- * The CheckSizeOf function does not have a way for the caller to
- * specify header files to be included to provide the type being
- * checked.  As a workaround until that is remedied, include the
- * header required for time_t, which is the sole current use of this
- * function.
- */
-#include <time.h>
-
-int main() {
-    printf("%d", (int)sizeof(""" + type + """));
-    return 0;
-}
-"""
-
-    # compile it
-    ret = context.TryCompile(program, '.c')
-    if 0 == ret:
-        announce('ERROR: TryCompile failed\n')
-        # fall back to sizeof(time_t) is 8
-        return '8'
-
-    # run it
-    ret = context.TryRun(program, '.c')
-    context.Result(ret[0])
-    return ret[1]
-
-
 def CheckCompilerDefines(context, define):
     context.Message('Checking if compiler supplies %s... ' % (define,))
     ret = context.TryLink("""
@@ -708,8 +691,8 @@ config = Configure(env, custom_tests={
     'CheckCompilerOption': CheckCompilerOption,
     'CheckHeaderDefines': CheckHeaderDefines,
     'CheckPKG': CheckPKG,
-    'CheckSizeOf': CheckSizeOf,
     'CheckXsltproc': CheckXsltproc,
+    'CheckTime_t': CheckTime_t,
     'GetPythonValue': GetPythonValue,
     })
 
@@ -1043,11 +1026,13 @@ else:
             confdefs.append("/* #undef HAVE_%s_H */\n"
                             % hdr.replace("/", "_").upper())
 
-    sizeof_time_t = config.CheckSizeOf("time_t")
-    confdefs.append("#define SIZEOF_TIME_T %s\n" % sizeof_time_t)
-    announce("sizeof(time_t) is %s" % sizeof_time_t)
-    if 4 >= int(sizeof_time_t):
+    if 0 == config.CheckTime_t():
         announce("WARNING: time_t is too small.  It will fail in 2038")
+        sizeof_time_t = 4
+    else:
+        sizeof_time_t = 8
+
+    confdefs.append("#define SIZEOF_TIME_T %s\n" % sizeof_time_t)
 
     # check function after libraries, because some function require libraries
     # for example clock_gettime() require librt on Linux glibc < 2.17
-- 
2.18.4

